#include "InetAddress.h"
#include <strings.h>
#include <string.h>

InetAddress::InetAddress(uint16_t port,std::string ip)
{
    //addr_是一个sockaddr_in结构，用于存储IPv4地址。
    bzero(&addr_,sizeof(addr_));
    //这行代码将addr_的地址族字段sin_family设置为AF_INET，表示这是一个IPv4网络地址。
    addr_.sin_family = AF_INET;
    //设置端口号，并将其从主机字节序转换为网络字节序。
    addr_.sin_port = htons(port);
    // 将IP地址字符串转换为网络字节序。
    addr_.sin_addr.s_addr = inet_addr(ip.c_str());
}

//得到ip地址
std::string InetAddress::toIp() const
{
    char buf[64]={0};
    //将网络地址（在这里是IPv4）转换成“点分十进制”的字符串格式。
    inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof(buf));
    return buf;
}

std::string InetAddress::toIpPort() const
{
    //ip:port
    char buf[64]={0};
    //同样是将IP地址转换为字符串。
    inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof(buf));
    size_t end = strlen(buf);
    // 将端口号从网络字节序转换回主机字节序。
    uint16_t port = ntohs(addr_.sin_port);
    //将端口号添加到IP字符串的末尾。
    sprintf(buf+end,":%u",port);
    return buf;
}

uint16_t InetAddress::toPort() const
{
    //返回端口号，转换为主机字节序。
    return ntohs(addr_.sin_port);
}

// #include <iostream>
// int main()
// {
//     InetAddress addr(8080);
//     std::cout << addr.toIp() << std::endl;
//     return 0;
// }
